#version 300 es
#extension GL_OES_EGL_image_external_essl3 : require
//高精度绘制，否则会模糊
precision highp float;
//precision mediump float;
uniform samplerExternalOES utexture0;
uniform float uValue;
uniform vec2 iResolution;
in vec2 o_uv;
out vec4 fragColor;
void main()
{
//    //动画总时间
//    float duration = 0.7;
//    //最大的透明度
//    float maxAlpha = 0.4;
//    //最大放大大小
//    float maxScale = 1.8;
//    //整个动画进度
//    float progress = mod(uValue, duration) / duration; // 0~1
//    //根据进度算出透明度，因为透明度是从0.4开始递减的，所以是最大值乘以剩余进度
//    float alpha = maxAlpha * (1.0 - progress);
//    //根据进度算出放大大小，因为放大是【1，1.8】，所以是最大值减1乘以进度再加1.0
//    float scale = 1.0 + (maxScale - 1.0) * progress;
//    //获取放大后的纹理坐标X和Y
//    float weakX = 0.5 + (o_uv.x - 0.5) / scale;
//    float weakY = 0.5 + (o_uv.y - 0.5) / scale;
//    vec2 weakTextureCoords = vec2(weakX, weakY);
//    //获取放大纹理
//    vec4 weakMask = texture(utexture0, weakTextureCoords);
//    //获取原纹理
//    vec4 mask = texture(utexture0, o_uv);
//    //将原纹理和放大纹理进行混合
//    fragColor = mask * (1.0 - alpha) + weakMask * alpha;



    //一次抖动效果的时长
    float duration = 0.7;
    //放大图片的上限
    float maxScale = 1.1;
    //颜色偏移的步长
    float offset = 0.02;

    //进度 0 ~ 1
    float progress = mod(uValue, duration) / duration;
    //颜色偏移值0 ~ 0.02
    vec2 offsetCoords = vec2(offset, offset) * progress;
    //缩放比例 1.0 ~ 1.1
    float scale = 1.0 + (maxScale - 1.0) * progress;

    //放大后的纹理坐标
    //下面这种向量相加减的方式 等价于 灵魂出窍滤镜中的单个计算x、y坐标再组合的为纹理坐标的方式
    vec2 ScaleTextureCoords = vec2(0.5, 0.5) + (o_uv - vec2(0.5, 0.5)) / scale;

    //获取三组颜色：颜色偏移计算可以随意，只要偏移量很小即可
    //原始颜色 + offset
    vec4 maskR = texture(utexture0, ScaleTextureCoords + offsetCoords);
    //原始颜色 - offset
    vec4 maskB = texture(utexture0, ScaleTextureCoords - offsetCoords);
    //原始颜色
    vec4 mask = texture(utexture0, ScaleTextureCoords);

    //从3组颜色中分别取出 红色R，绿色G，蓝色B，透明度A填充到内置变量gl_FragColor内
    fragColor = vec4(maskR.r, maskB.g, mask.b, mask.a);
}


